package com.wanghengzhi.girlfriend.rbac.core;

import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import java.util.Collections;
import java.util.List;

/**
 * 分页对象
 * 仅支持 {@link PageWrapper#PageWrapper(Page)} 构造对象
 * @author 王潇
 * @since 2021.6.23
 */
@Data
@SuppressWarnings("unused")
public class PageWrapper<T> {

    /**
     * 页码
     */
    private Integer page;

    /**
     * 数量
     */
    private Integer size;

    /**
     * 总页数
     */
    private Integer totalPages;

    /**
     * 总数量
     */
    private Long totalElements;

    /**
     * 数据
     */
    private List<T> contents;

    /**
     * 是否第一页
     */
    private Boolean isFirst;

    /**
     * 是否最后一页
     */
    private Boolean isLast;

    /**
     * 是否还有下一页
     */
    private Boolean hasNext;

    /**
     * 是否还有上一页
     */
    private Boolean hasPrevious;


    /**
     * @param page Page
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public PageWrapper(Page page) {
        // spring data 分页是从0 开始的。
        this.page = page.getNumber() + 1;
        this.size = page.getSize();
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.hasNext = page.hasNext();
        this.hasPrevious = page.hasPrevious();
        this.isFirst = page.isFirst();
        this.isLast = page.isLast();
        this.contents = Collections.EMPTY_LIST;
    }

    /**
     * 这里包装分页信息，是因为spring默认分页从0开始。
     * @param page 页码
     * @param size 数量
     * @return PageRequest
     */
    public static PageRequest of(int page, int size) {
        return PageRequest.of(page - 1, size);
    }
    public static PageRequest of(int page, int size, Sort sort) {
        return PageRequest.of(page - 1, size, sort);
    }
    public static PageRequest of(int page, int size, Sort.Direction direction, String... properties) {
        return PageRequest.of(page - 1, size, direction, properties);
    }
    public static PageRequest ofSize(int pageSize) {
        return of(0, pageSize);
    }

}
